package com.hsh.tools.uploads;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FilesToZip {
    public boolean fileToZips(String sourceFilePath, String zipFilePath, String zipFileName) throws Exception {
        boolean flag = false;
        BufferedInputStream bis = null;
        ZipOutputStream zos = null;
        File sourceFiles = new File(sourceFilePath);
        if (sourceFiles.exists() == false) {
            System.out.println("待压缩目录" + sourceFiles + "不存在...");
        } else {
            //判断待压缩文件是否已经被压缩过 zipFiles--->fos--->zos设置压缩包名称
            File zipFiles = new File(zipFilePath + "//" + zipFileName + ".zip");
            if (zipFiles.exists()) {
                System.out.println(zipFilePath + "目录下已经存在" + zipFileName + ".zip" + "压缩包...");
            } else {
                //得到指定目录下的所有文件夹，注意返回的File数组，不是String数组
                File[] sourceFileList = sourceFiles.listFiles();
                if (null == sourceFileList || sourceFileList.length < 1) {
                    System.out.println(sourceFilePath + "目录下没有待压缩的文件...");
                } else {
                    FileOutputStream fos = new FileOutputStream(zipFiles);
                    zos = new ZipOutputStream(fos);
                    byte[] bys = new byte[1024 * 10];
                    for (int i = 0; i < sourceFileList.length; i++) {
                        //fileName：指定目录下的文件夹的名称或文件的名称
                        String fileName = sourceFileList[i].getName();
                        //创建zip实体，并添加进压缩包  ，zipEntry的值就是fileName的值
                        ZipEntry zipEntry = new ZipEntry(sourceFileList[i].getName());
                        //添加进压缩包
                        zos.putNextEntry(zipEntry);
                        //读取待压缩文件，并添加进压缩包，FileInputStream读的是一个具体文件，不是一个文件夹
                        FileInputStream fis = new FileInputStream(sourceFileList[i]);
                        //如果遇到bis存储空间不够，可以把1024*10的限制取消。
                        bis = new BufferedInputStream(fis, 1024 * 10);
                        //记录当前读取的字节数
                        int reads = 0;
                        while ((reads = bis.read(bys, 0, 1024 * 10)) != -1) {
                            zos.write(bys, 0, reads);
                        }

                    }
                    flag = true;
                    //特别注意，如果不关闭流端口，可能会导致压缩打包不成功！
                    if (null != bis) {
                        bis.close();
                    }
                    if (null != zos) {
                        zos.close();
                    }
                }
            }

        }
        return flag;

    }

}
